﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace zoo
{
    /// <summary>
    /// UnitTest1 の概要の説明
    /// </summary>
    [TestClass]
    public class UnitTest1
    {
        public UnitTest1()
        {
            //
            // TODO: コンストラクター ロジックをここに追加します
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///現在のテストの実行についての情報および機能を
        ///提供するテスト コンテキストを取得または設定します。
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region 追加のテスト属性
        //
        // テストを作成する際には、次の追加属性を使用できます:
        //
        // クラス内で最初のテストを実行する前に、ClassInitialize を使用してコードを実行してください
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // クラス内のテストをすべて実行したら、ClassCleanup を使用してコードを実行してください
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // 各テストを実行する前に、TestInitialize を使用してコードを実行してください
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // 各テストを実行した後に、TestCleanup を使用してコードを実行してください
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        static string Tokenize(ref string src) {
          string tmp = null;
          if ( !string.IsNullOrEmpty(src) ) {
            tmp = src.Replace('　', ' ').Trim();
            if ( string.IsNullOrEmpty(tmp) ) {
              tmp = null;
            } else {
              int pos = tmp.IndexOf(' ');
              if (pos < 0) {
                src = string.Empty;
              } else {
                src = tmp.Substring(pos);
                tmp = tmp.Substring(0, pos);
              }
            }
          }
          return tmp;
        }

        delegate void Operation(IList<double> list);
        Dictionary<string, Operation> op_dic = new Dictionary<string, Operation>();

        [TestMethod]
        public void TestMethod1()
        {
            string str;
            str = "  abc def   ghi  ";
            Assert.AreEqual("abc", Tokenize(ref str));
            Assert.AreEqual("def", Tokenize(ref str));
            Assert.AreEqual("ghi", Tokenize(ref str));
            Assert.IsNull(Tokenize(ref str));
            str = "  abc 　 def　   ghi  ";
            Assert.AreEqual("abc", Tokenize(ref str));
            Assert.AreEqual("def", Tokenize(ref str));
            Assert.AreEqual("ghi", Tokenize(ref str));
            Assert.IsNull(Tokenize(ref str));
        }

        [TestMethod]
        public void TestMethod2()
        {
            string str;
            str = null;
            Assert.IsNull(Tokenize(ref str));
            str = "";
            Assert.IsNull(Tokenize(ref str));
            str = "   ";
            Assert.IsNull(Tokenize(ref str));
        }

        [TestMethod]
        public void TestMethod3()
        {
            op_dic.Add(".add", list => { list[1] = list[1] + list[0]; list.RemoveAt(0); });
            op_dic.Add(".sub", list => { list[1] = list[1] - list[0]; list.RemoveAt(0); });
            IList<double> l = new List<double>();
            l.Add(1.0);
            l.Add(2.0);
            l.Add(3.0);
            op_dic[".add"](l);
            Assert.AreEqual(2, l.Count);
            Assert.AreEqual(3.0, l[0]);
            Assert.AreEqual(3.0, l[1]);
        }

    }
}
